package algoritmo.cruzamiento;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

import poblacion.Cromosoma;
import poblacion.Poblacion;

public abstract class Cruzador {
	
	public  Poblacion cruzar(Poblacion poblacion){
		Poblacion result = new Poblacion();
		List<Cromosoma> cromos = new ArrayList<Cromosoma>();
		Stack<Cromosoma> cromosomas = this.apilar(poblacion);
		if (cromosomas.size()%2!=0) {
			//numero impar, para cruzar necesitamos una cantidad par de cromosomas
			cromos.add(cromosomas.pop());
		}
		
		while (!cromosomas.isEmpty()){
			//Tomo los cromosomas de a dos y los "apareo"
			Cromosoma c1 = cromosomas.pop();
			Cromosoma c2 = cromosomas.pop();
			this.cruzar(c1, c2);
			cromos.add(c1);
			cromos.add(c2);
		}
		Collections.sort(cromos);
		result.setCromosomas(cromos);
		return result;
	}
	
	protected abstract void cruzar(Cromosoma c1, Cromosoma c2);
	
	/**
	 * 
	 * @param poblacion
	 * @return pila de cromosomas 
	 */
	protected Stack<Cromosoma> apilar(Poblacion poblacion){
		
		List<Cromosoma> cromos = poblacion.getCromosomas();
		Stack<Cromosoma> result = new Stack<Cromosoma>();
		result.addAll(cromos);
		return result;
	}
}
